package service

import (
	"github.com/beego/beego/v2/server/web"
	srv "github.com/kardianos/service"
	"os"
)

type Program struct {
	exit chan struct{}
	Run  func()
}

func (p *Program) Start(s srv.Service) error {
	if srv.Interactive() {
		println("请注意：正在终端模式运行，关闭窗口会导致服务器程序停止服务！")
	} else {
		println("以服务的形式运行") //你不可能看到这句话
	}
	p.exit = make(chan struct{})
	// Start should not block. Do the actual work async.
	// 翻译：run方法，必须以异步的形式执行，不然...自己试试就行
	go p.Run()
	return nil
}

func (p *Program) Stop(s srv.Service) error {
	// Any work in Stop should be quick, usually a few seconds at most.
	close(p.exit)
	return nil
}

func RunOrServiceRun(mainFunc func()) {
	srvConfig := &srv.Config{
		Name:web.AppConfig.DefaultString("service::ServiceName","go_v20"),
		DisplayName: web.AppConfig.DefaultString("service::ServiceDisplayName","go_v20"),
		Description: web.AppConfig.DefaultString("service::ServiceDescription","这里用来描述这个服务是干什么用的"),
	}
	prg := &Program{}
	prg.Run = mainFunc
	s, err := srv.New(prg, srvConfig)
	if err != nil {
		println(err)
	}
	if len(os.Args) > 1 {
		serviceAction := os.Args[1]
		switch serviceAction {
		case "install":
			err := s.Install()
			if err != nil {
				println("安装服务失败: ", err.Error())
			} else {
				println("安装服务成功")
			}
			return
		case "uninstall":
			err := s.Uninstall()
			if err != nil {
				println("卸载服务失败: ", err.Error())
			} else {
				println("卸载服务成功")
			}
			return
		case "start":
			err := s.Start()
			if err != nil {
				println("运行服务失败: ", err.Error())
			} else {
				println("运行服务成功")
			}
			return
		case "stop":
			err := s.Stop()
			if err != nil {
				println("停止服务失败: ", err.Error())
			} else {
				println("停止服务成功")
			}
			return
		case "status":
			status, err := s.Status()
			if err != nil {
				println("停止服务失败: ", err.Error())
			} else {
				println("停止服务成功", status)
			}
			return
		}
	}
	err = s.Run()
	if err != nil {
		println(err.Error())
	}

}
